/**
  ************************************* Copyright ******************************
  * FileName   : io_ctrl.c
  * Version    : v1.0
  * Author     : yychao
  * Date       : 2023-08-07
  * Description:
  * Function List:
  	1. ....
  	   <version>:
  <modify staff>:
  		  <data>:
   <description>:
  	2. ...
  ******************************************************************************
 */
#include "io_ctrl.h"
#include "gpio.h"
#include "log.h"
#include "screen.h"
#include "soft_timer.h"
#include "lfs_port.h"
#include "my_protocol.h"

struct ctrl_state ctrl_state_st;
struct dev_sta dev_sta_ready;
struct dev_sta dev_sta_real;

struct io_ctrl io_ctrl_st;
struct io_ctrl io_ctrl_bk_st;
void ctrl_manage(void)
{
    io_ctrl_st.swh = GPIO_ReadInputDataBit(GPIOB, GPIO_PIN_3);
    io_ctrl_st.swl = GPIO_ReadInputDataBit(GPIOB, GPIO_PIN_4);


    /*
    PWM1: FAN1 FAN2 Y1 Y2 R1 B1
    PWM1: FAN2 FAN3 Y1 Y2 R3 B3
    */
    if(io_ctrl_st.pwm1 != io_ctrl_bk_st.pwm1) {
        io_ctrl_bk_st.pwm1 = io_ctrl_st.pwm1;
        LOG_KEY("PWM1 OUTPUT: %d \r\n", io_ctrl_st.pwm1);
    }
    if((io_ctrl_st.pwm1 != 0)
            &&(pro_data_recv_st.coil[4] == 0x55 )
            &&(pro_data_recv_st.coil[6] == 0x55 )
            &&(pro_data_recv_st.coil[8] == 0x55 )
            &&(pro_data_recv_st.coil[9] == 0x55 )) {
        TIM_SetCmp4(TIM1, io_ctrl_st.pwm1);
    } else {
        TIM_SetCmp4(TIM1, io_ctrl_st.pwm1);
    }

    if(io_ctrl_st.pwm2 != io_ctrl_bk_st.pwm2) {
        io_ctrl_bk_st.pwm2 = io_ctrl_st.pwm2;
        LOG_KEY("PWM2 OUTPUT: %d \r\n", io_ctrl_st.pwm2);
    }
    if((io_ctrl_st.pwm2 != 0)
            &&(pro_data_recv_st.coil[5] != 0x55 )
            &&(pro_data_recv_st.coil[7] != 0x55 )
            &&(pro_data_recv_st.coil[8] != 0x55 )
            &&(pro_data_recv_st.coil[9] != 0x55 ))  {

        TIM_SetCmp2(TIM1, io_ctrl_st.pwm2);
    } else {
        TIM_SetCmp2(TIM1, io_ctrl_st.pwm2);
    }
}

void io_ctrl_init(void)
{

    GPIO_InitType GPIO_InitStructure = { 0 };
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);

    /*output PUSH_ROD_VCC*/
    GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE);
    GPIO_InitStructure.Pin        = GPIO_PIN_15;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
    gpio_off(GPIOA, GPIO_PIN_15);
    /*output PUSH_ROD TURN Forward/Backward*/
    gpio_init_out(GPIOB, GPIO_PIN_5);
    gpio_off(GPIOB, GPIO_PIN_5);


    GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE);
    GPIO_InitStructure.Pin        = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

    GPIO_ConfigPinRemap(GPIO_RMP_SW_JTAG_SW_ENABLE, ENABLE);
    GPIO_InitStructure.Pin        = GPIO_PIN_4;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);




#if 0
    /*output push leaf ctrl io_1*/
    gpio_init_out(GPIOA, GPIO_PIN_12);
    gpio_off(GPIOA, GPIO_PIN_12);
    /*output push leaf ctrl io_2*/
    gpio_init_out(GPIOA, GPIO_PIN_11);
    gpio_off(GPIOA, GPIO_PIN_11);

    /*output camera power*/
    gpio_init_out(GPIOA, GPIO_PIN_8);
    gpio_off(GPIOA, GPIO_PIN_8);

    /*output camera lamp*/
    gpio_init_out(GPIOC, GPIO_PIN_9);
    gpio_off(GPIOC, GPIO_PIN_9);

    /*output bk1*/
    gpio_init_out(GPIOC, GPIO_PIN_8);
    gpio_off(GPIOC, GPIO_PIN_8);

    /*output PUSH_ROD_VCC*/
    gpio_init_out(GPIOC, GPIO_PIN_7);
    gpio_off(GPIOC, GPIO_PIN_7);
    /*output PUSH_ROD TURN Forward/Backward*/
    gpio_init_out(GPIOC, GPIO_PIN_6);
    gpio_off(GPIOC, GPIO_PIN_6);

    /*input bk1*/
    gpio_init_in(GPIOD, GPIO_PIN_15);
    /*input bk2*/
    gpio_init_in(GPIOD, GPIO_PIN_14);


    /*input I_AIR_DOOR_ON*/
    gpio_init_in(GPIOD, GPIO_PIN_13);
    /*input I_AIR_DOOR_OFF*/
    gpio_init_in(GPIOD, GPIO_PIN_12);

    /*output AIR_DOOR ctrl io_1*/
    gpio_init_out(GPIOD, GPIO_PIN_8);
    gpio_off(GPIOD, GPIO_PIN_8);
    /*output AIR_DOOR ctrl io_2*/
    gpio_init_out(GPIOB, GPIO_PIN_15);
    gpio_off(GPIOB, GPIO_PIN_15);


    /*output CYCLE_FAN CTRL*/
    gpio_init_out(GPIOB, GPIO_PIN_14);
    gpio_off(GPIOB, GPIO_PIN_14);
    /*output CYCLE_FAN High/Low Speed*/
    gpio_init_out(GPIOB, GPIO_PIN_13);
    gpio_off(GPIOB, GPIO_PIN_13);

    /*output FEED_MOTOR CTRL*/
    gpio_init_out(GPIOB, GPIO_PIN_12);
    gpio_off(GPIOB, GPIO_PIN_12);

    /*output BURNER_ROD CTRL*/
    gpio_init_out(GPIOE, GPIO_PIN_14);
    gpio_off(GPIOE, GPIO_PIN_14);

    /*output BURNER_FAN CTRL*/
    gpio_init_out(GPIOE, GPIO_PIN_13);
    gpio_off(GPIOE, GPIO_PIN_13);


    /*output CLEAR_MOTOR CTRL*/
    gpio_init_out(GPIOE, GPIO_PIN_12);
    gpio_off(GPIOE, GPIO_PIN_12);
    /*output CLEAR_MOTOR Forward/Backward*/
    gpio_init_out(GPIOE, GPIO_PIN_11);
    gpio_off(GPIOE, GPIO_PIN_11);
#endif
}